package com.atguigu.rabbitmq.routing;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * Producer
 *
 * @Author: 马伟奇
 * @CreateTime: 2021-02-24
 * @Description:
 */
public class Producer {
    // 发送消息
    public static void main(String[] args) throws Exception{
        // 创建连接工厂 完成初始化
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 设置数据源
        // 设置主机
        connectionFactory.setHost("localhost");
        // 设置端口号
        // 5672:表示服务器端口
        // 15672:表示后台系统的端口
        connectionFactory.setPort(5672);
        // 设置用户名
        connectionFactory.setUsername("guest");
        // 设置密码
        connectionFactory.setPassword("guest");
        // 设置虚拟主机
        connectionFactory.setVirtualHost("/");
        // 通过连接工厂获取连接对象
        Connection connection = connectionFactory.newConnection();
        // 创建频道
        Channel channel = connection.createChannel();
        // 声明交换机
//        String exchange,:表示交换机的名字
//        BuiltinExchangeType type,:交换机的类型
//                DIRECT("direct"),:定向发送，类似mysql里面的精确查询
//                FANOUT("fanout"),：广播发送，交换机收到消息之后，会把消息转发给所有队列
//                TOPIC("topic"),：模糊发送，类似mysql里面的模糊查询
//        boolean durable,:交换机需要进行持久化
//        boolean autoDelete,
//        boolean internal,
//        Map<String, Object> arguments
        String exchangeName = "test_direct";
        channel.exchangeDeclare(exchangeName,
                BuiltinExchangeType.DIRECT,
                true,
                false,
                false,
                null);



        // 创建队列 简单模式使用的是系统默认的交换机
// String queue,:队列的名字
// boolean durable,:是否需要持久化
// boolean exclusive,:是否独占连接
// boolean autoDelete,:是否需要自动删除
// Map<String, Object> arguments
        channel.queueDeclare("test_direct_queue1",
                true,
                false,
                false,
                null);

        channel.queueDeclare("test_direct_queue2",
                true,
                false,
                false,
                null);
        // 交换机需要跟队列进行绑定
//        String queue,:表示队列的名字
//        String exchange,：表示交换机的名字
//        String routingKey：表示路由规则,,
// 使用的是广播类型，广播模式不需要设置路由规则，所有的队列都可以收到消息
        channel.queueBind("test_direct_queue1",exchangeName,"error");

        channel.queueBind("test_direct_queue2",exchangeName,"error");
        channel.queueBind("test_direct_queue2",exchangeName,"info");
        channel.queueBind("test_direct_queue2",exchangeName,"warning");


        // 发送消息
//        String exchange,：交换机的名字，使用系统的默认交换机
//        String routingKey,：路由规则，简单默认的路由规则跟队列的名字保持一致
//        AMQP.BasicProperties:是否需要设置其他的属性，
//    props, byte[] body:消息体
        String message = "你好小兔子";
        channel.basicPublish(exchangeName,"info",null,message.getBytes());
        channel.close();
        connection.close();
    }
}